import sys
import os
# 获取项目根目录的绝对路径
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 将项目根目录添加到 sys.path
sys.path.append(project_root)

import logging

from src.performance_collector.metric_collector import MetricCollector
from src.performance_analyzer.performance_analyzer import PerformanceAnalyzer

from src.performance_collector.static_collector import collect_system_profile

from src.utils.shell_execute import SshClient
from src.utils.config.config import config
from src.utils.common import display_metrics

from src.performance_optimizer.pressure_test import PressureTest

from src.performance_optimizer.param_optimizer import ParamOptimizer,PerformanceMetric


logging.basicConfig(
    level=logging.INFO,  # 设置日志级别
    format="%(asctime)s - %(levelname)s - %(message)s",  # 设置日志格式
    datefmt="%Y-%m-%d %H:%M:%S",  # 设置时间格式
)
# logging.disable(logging.CRITICAL)

host_ip = config["servers"][0]["ip"]
host_port = config["servers"][0]["port"]
host_user = config["servers"][0]["host_user"]
host_password = config["servers"][0]["password"]
app = config["servers"][0]["app"]
max_retries = config["servers"][0]["max_retries"]
delay = config["servers"][0]["delay"]
need_restart_application = config["feature"][0]["need_restart_application"]
pressure_test_mode = config["feature"][0]["pressure_test_mode"]


ssh_client = SshClient(
    host_ip=host_ip,
    host_port=host_port,
    host_user=host_user,
    host_password=host_password,
    max_retries=max_retries,
    delay=delay,
)


static_profile = collect_system_profile(
    host_ip=host_ip,
    host_port=host_port,
    host_user=host_user,
    host_password=host_password,
)
print(static_profile)
#static_profile = {'CPU 逻辑核心数量': 2, '每个物理 CPU 插槽上的核心数': 1, '物理 CPU 插槽数量': 1, 'NUMA 节点数量': 1, 'cpu_mhz': 2500.002, 'L3 缓存容量（字节）': 34603008, 'numa_node0_cpu(s)': '0,1', '总共内存大小（GB）': 1.72, '已用内存大小（GB）': 0.31, '空闲内存大小（GB）': 0.85, '可用内存大小（GB）': 1.23, '系统页大小（字节）': 4096, 'HugePages 总数': 0, 'HugePages 空闲数': 0, 'HugePages 保留但未使用数': 0, 'HugePages 超量分配数': 0, '磁盘 vda 类型': '机械硬盘（HDD）', 'vda_iops': 0.0, 'vda_读操作吞吐率_kB_s': 0.0, 'vda_写操作吞吐率_kB_s': 0.0, '块设备vda_队列请求深度': 256, 'fs_/': 'ext4', '最大文件描述符': 65535} 

exit(1)

if pressure_test_mode:
    logging.info(f"[Main] start pressure test ...")
    # 压测模式若开启，则采集前通过压测模拟负载环境，压测期间采集负载数据
    # 压测模式若关闭，则按照流程执行benchmark作为基线
    pressure_test = PressureTest(app, ssh_client)
    pressure_test.start()



metric_collector = MetricCollector(
    host_ip=host_ip,
    host_port=host_port,
    host_user=host_user,
    host_password=host_password
)
data = metric_collector.run_all_collector()
print(data)
display_metrics(data, headers=["负载类型", "指标名", "指标值"])




logging.info("[Main] analyzing performance ...")
testAnalyzer = PerformanceAnalyzer(data=data)
report, bottleneck = testAnalyzer.run()
print(">>> PerformanceAnalyzer运行结果：", report, bottleneck)


# report = {"Cpu":"1. 负载指标分析:\n- 1分钟平均负载为3.66，显著高于5分钟的1.05和10分钟的0.375，表明系统近期出现突发性高负载\n- 5分钟负载(1.05)仍高于10分钟负载(0.375)，显示负载上升趋势持续存在\n- 1分钟负载值超过常见警戒阈值(通常为CPU核心数)，确认存在短期过载情况\n\n2. CPU使用率分析:\n- 总体CPU利用率已达100%，系统资源完全饱和\n- 内核态利用率异常偏高(84.65%)，远超用户态(14.85%)，表明系统调用开销过大\n- 中断处理占比接近0%(硬中断0.0%，软中断0.0%)，可排除中断导致的性能问题\n\n3. 进程状态分析:\n- 阻塞进程占比极低(0.0098%)，说明CPU资源竞争是主要瓶颈，而非I/O等待\n- 结合高内核态使用率，推测可能存在频繁的进程上下文切换或系统调用\n\n4. 趋势分析:\n- 10分钟内负载持续上升(从0.375→1.05→3.66)，且1分钟内出现陡增\n- 系统当前处于持续恶化状态，内核处理能力已显不足","Memory":"1. 系统内存使用率已达到93.54%（0.9354），表明物理内存资源已接近耗尽状态，系统处于高内存压力环境。\n\n2. 系统可用交换空间百分比为0%，交换分区已被完全占用，虚拟内存资源完全耗尽。根据系统警告信息，这种情况可能导致系统因无法分配虚拟内存而出现严重性能问题或进程异常终止。\n\n3. 当前内存状态显示系统同时存在物理内存和交换空间的双重耗尽情况，属于严重的内存资源不足状态，系统性能已受到实质性影响。","Disk":"1. 系统iowait值为0，表明当前系统没有因磁盘I/O等待而产生的CPU空闲时间，磁盘I/O未对系统整体性能造成瓶颈。\n\n2. 磁盘vda的利用率为0.0%，说明该磁盘当前处于极低负载状态，未达到其I/O处理能力的瓶颈。\n\n3. 磁盘vda的读速率为100.99 KB/s（假设单位为KB/s），写速率为0.0 KB/s，表明当前仅有读取操作且数据量较小，无写入操作发生。\n\n4. 综合iowait、磁盘利用率和读写速率指标，可以确认当前磁盘vda处于非常空闲的状态，未出现任何性能压力或资源争用情况。","Network":"1. 网络负载处于极低水平\n- eth0接口接收速率为0.32kB/s(2.97 packets/s)，发送速率为0.95kB/s(2.97 packets/s)\n- lo接口双向传输速率均为0.15kB/s(1.98 packets/s)\n- 所有数值均显著低于千兆网卡的理论带宽上限\n\n2. 流量模式分析\n- eth0接口呈现显著的非对称传输特征，发送数据量(txkB/s 0.95)是接收量(rxkB/s 0.32)的2.97倍\n- 环回接口流量完全对称，符合本地通信的预期特征\n\n3. 异常流量监测结果\n- 所有接口的压缩包指标(rxcmp/s,txcmp/s)持续为0\n- 组播包指标(rxmcst/s)始终为0\n- 未检测到任何异常流量模式\n\n4. 数据可靠性说明\n- 分析基于2025-07-02 20:32:01的采样数据\n- 所有指标均为系统直接采集的平均值\n- 数据经过验证真实可信"}
# bottleneck = "CPU"

def slo_calc_callback(baseline, benchmark_result):
    if baseline is None or abs(baseline) < 1e-9:
        return 0.0
    return (benchmark_result - baseline) / baseline


param_optimizer = ParamOptimizer(
    service_name=app,
    performance_metric=PerformanceMetric.CPU_USAGE,
    slo_goal=0.1,
    analysis_report=report,
    static_profile=static_profile,
    ssh_client=ssh_client,
    slo_calc_callback=slo_calc_callback,
    max_iterations=1,
    need_restart_application=need_restart_application,
    pressure_test_mode=pressure_test_mode,
)
param_optimizer.run()


